package com.cx.proxy.demo;

import com.sun.org.apache.bcel.internal.generic.NEW;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

/**
 * @author zhangshuai
 * @version V1.0
 * @Project Java2_26
 * @Package com.cx.proxy.demo
 * @Description:
 * @Date 2025/5/28 17:17
 */

public class ProxyTest {
//2、创建一个图片加载系统，使用代理模式来控制对真实图片加载和下载。
//需求：
//添加访问控制，检查用户是否有权限查看和下载图片。
//如果用户的权限列表中存在加载图片或下载的图片的权限（方法名同），就能加载或下
//载图片，否则抛出异常。
public static void main(String[] args) {
        //创建真实图片对象
    Images realImages = new RealImages();
    Users users = new Users();
    //授权
    users.authorize("loadImage");


    //创建代理图片对象
    Images proxy = (Images) new ProxyImages(realImages,users).getProxy();
    //代理图片对象调用方法
    proxy.loadImage();
    proxy.downloadImage();


}



}


interface Images{
    /**
     * 加载图片
     */
    void loadImage();
    /**
     * 下载图片
     */
    void downloadImage();
}


//真实图片类
class RealImages implements Images{
    @Override
    public void loadImage() {
        System.out.println("加载图片");
    }
    @Override
    public void downloadImage() {
        System.out.println("下载图片");
    }
}
//代理图片类
class ProxyImages implements InvocationHandler{
    //真实图片对象
    private Object target;
    private Users users;

    public ProxyImages(Object target, Users users) {
        this.target = target;
        this.users = users;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //判断用户是否有权限
        String name = method.getName();
        Object invoke = null;
        if(users.hasRole(name)){
             invoke= method.invoke(target, args);
        }else{
            System.out.println("没有权限");
//            throw new RuntimeException("没有权限");
        }
        return invoke;

        //method.invoke()方法是通过反射机制调用真实图片对象的方法

    }

    public Object getProxy(){
        //通过Proxy.newProxyInstance()方法创建代理对象
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),this);
    }


}

class Users{
    private List<String> roles = new ArrayList<>();
    //授权
    public void authorize(String role){
        System.out.println("授权");
        roles.add(role);
    }
    //取消权限
    public void revoke(String role){
        System.out.println("取消权限");
        roles.remove(role);
    }
    //检查是否有权限
    public boolean hasRole(String role){
        return roles.contains(role);
    }
    //获取权限列表
    public List<String> getRoles() {
        return roles;
    }

}